<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Asynchronous Operations</title>
<link rel="stylesheet" href="../../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
<link rel="home" href="../../../boost_asio.html" title="Boost.Asio">
<link rel="up" href="../model.html" title="Asynchronous Model">
<link rel="prev" href="../model.html" title="Asynchronous Model">
<link rel="next" href="async_agents.html" title="Asynchronous Agents">
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr>
<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../boost.png"></td>
<td align="center"><a href="../../../../../index.html">Home</a></td>
<td align="center"><a href="../../../../../libs/libraries.htm">Libraries</a></td>
<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
<td align="center"><a href="../../../../../more/index.htm">More</a></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="../model.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../model.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../boost_asio.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="async_agents.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="boost_asio.overview.model.async_ops"></a><a class="link" href="async_ops.html" title="Asynchronous Operations">Asynchronous Operations</a>
</h4></div></div></div>
<p>
          <span class="inlinemediaobject"><img src="../../async_op_model.png" width="421"></span>
        </p>
<p>
          An <span class="emphasis"><em>asynchronous operation</em></span> is the basic unit of composition
          in the Boost.Asio asynchronous model. Asynchronous operations represent
          work that is launched and performed in the background, while the user's
          code that initiated the work can continue with other things.
        </p>
<p>
          Conceptually, the lifecycle of an asynchronous operation can be described
          in terms of the following events and phases:
        </p>
<p>
          <span class="inlinemediaobject"><img src="../../async_op_phases.png" width="861"></span>
        </p>
<p>
          An <span class="emphasis"><em>initiating function</em></span> is a function which may be
          called by the user to start an asynchronous operation.
        </p>
<p>
          A <span class="emphasis"><em>completion handler</em></span> is a user-provided, move-only
          function object that will be invoked, at most once, with the result of
          the asynchronous operation. The invocation of the completion handler tells
          the user about something that has already happened: the operation completed,
          and the side effects of the operation were established.
        </p>
<p>
          The initiating function and completion handler are incorporated into the
          user's code as follows:
        </p>
<p>
          <span class="inlinemediaobject"><img src="../../async_op_init_complete.png" width="496"></span>
        </p>
<p>
          Synchronous operations, being embodied as single functions, have several
          inherent semantic properties as a consequence. Asynchronous operations
          adopt some of these semantic properties from their synchronous counterparts,
          in order to facilitate flexible and efficient composition.
        </p>
<div class="informaltable"><table class="table">
<colgroup>
<col>
<col>
</colgroup>
<thead><tr>
<th>
                  <p>
                    Property of synchronous operations
                  </p>
                </th>
<th>
                  <p>
                    Equivalent property of asynchronous operations
                  </p>
                </th>
</tr></thead>
<tbody>
<tr>
<td>
                  <p>
                    When a synchronous operation is generic (i.e. a template) the
                    return type is deterministically derived from the function and
                    its arguments.
                  </p>
                </td>
<td>
                  <p>
                    When an asynchronous operation is generic, the completion handler's
                    arguments' types and order are deterministically derived from
                    the initiating function and its arguments.
                  </p>
                </td>
</tr>
<tr>
<td>
                  <p>
                    If a synchronous operation requires a temporary resource (such
                    as memory, a file descriptor, or a thread), this resource is
                    released before returning from the function.
                  </p>
                </td>
<td>
                  <p>
                    If an asynchronous operation requires a temporary resource (such
                    as memory, a file descriptor, or a thread), this resource is
                    released before calling the completion handler.
                  </p>
                </td>
</tr>
</tbody>
</table></div>
<p>
          The latter is an important property of asynchronous operations, in that
          it allows a completion handler to initiate further asynchronous operations
          without overlapping resource usage. Consider the trivial (and relatively
          common) case of the same operation being repeated over and over in a chain:
        </p>
<p>
          <span class="inlinemediaobject"><img src="../../async_op_trivial_chain.png" width="375"></span>
        </p>
<p>
          By ensuring that resources are released before the completion handler runs,
          we avoid doubling the peak resource usage of the chain of operations.
        </p>
</div>
<div class="copyright-footer">Copyright © 2003-2023 Christopher M. Kohlhoff<p>
        Distributed under the Boost Software License, Version 1.0. (See accompanying
        file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
      </p>
</div>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="../model.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../model.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../boost_asio.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="async_agents.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>
